package com.llh.controller.excel;

import com.llh.controller.http.DailyTrade;
import lombok.Data;
import org.apache.log4j.LogManager;
import org.apache.log4j.Logger;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.util.Date;
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

// 基本模板的Excel导出工具类
@Data
public class ExcelExportUtil<T> {
    static Logger logger = LogManager.getLogger(DailyTrade.class.getName());

    // 写入数据的起始行
    private int rowIndex;
    // 需要提取样式所在的行号
    private int styleIndex;
    // 对象的字节码
    private Class clazz;
    // 对象中的所有属性
    private Field fields[];

    // 构造方法
    public ExcelExportUtil(Class clazz, int rowIndex, int styleIndex) {
        this.clazz = clazz;
        this.rowIndex = rowIndex;
        this.styleIndex = styleIndex;
        fields = clazz.getDeclaredFields();
    }

    /**
     * 基于注解导出
     * response：响应对象，用于往浏览器导出数据(文件下载)
     * is：模板文件对应的输入流
     * objs：要导出的数据，即从数据库中查询的对象数据集合
     * fileName：导出的文件名(文件下载名)
     */
    public void export(InputStream is, List<T> objs, File out, Integer[] dateCellIndex) throws Exception {
        FileOutputStream fileOutputStream = null;
        try{
            String dateFormat = "yyyy-MM-dd";//或者"yyyy/MM/dd"格式,"yyyy/M/d"这样的格式不会自动补0
            // 根据模板创建工作簿(.xlsx)
            XSSFWorkbook workbook = new XSSFWorkbook(is);
            // 获得工作表
            Sheet sheet = workbook.getSheetAt(0);
            // 获取公共样式
            CellStyle[] styles = getTemplateStyles(sheet.getRow(styleIndex));
            AtomicInteger datasAi = new AtomicInteger(rowIndex);
            // 遍历集合
            int num = 0;
            for (T t : objs) {
                // 创建每一行对象
                Row row = sheet.createRow(datasAi.getAndIncrement());
                for (int i = 0; i < styles.length; i++) {
                    // 创建一个单元格对象(每一列)
                    Cell cell = row.createCell(i);
                    //设置单元格样式
                    if (dateCellIndex != null && dateCellIndex.length > 0) {
                        for (Integer integer : dateCellIndex) {
                            if (i == integer) {
                                //设置为:自定义时间类型格式
                                DataFormat format = workbook.createDataFormat();// 日期格式化
                                CellStyle cellStyle = workbook.createCellStyle();
                                cellStyle.setDataFormat(format.getFormat(dateFormat));
                                cell.setCellStyle(cellStyle);
                            }
                        }
                    } else {
                        // 设置列的样式为模板中的样式
                        cell.setCellStyle(styles[i]);
                    }
                    //给单元格赋值
                    // 遍历成员变量对象
                    for (Field field : fields) {
                        // 判断成员变量上是否使用了ExcelAttribute注解
                        if (field.isAnnotationPresent(ExcelAttribute.class)) {
                            // 暴露反射
                            field.setAccessible(true);
                            // 获得注解对象
                            ExcelAttribute ea = field.getAnnotation(ExcelAttribute.class);
                            if (i == ea.sort()) {
                                //field类型
                                Class<?> type = field.getType();
                                if(type.equals(Date.class)){
                                    cell.setCellValue((Date) field.get(t));
                                }else if(type.equals(Double.class)) {
                                    cell.setCellValue((Double) field.get(t));
                                }else{
                                    // 设置单元格内容为字符串
                                    cell.setCellValue(field.get(t).toString());
                                }
                            }
                        }
                    }

                }
                logger.info("插入一行,一插入:" + (++num));

            }
            fileOutputStream = new FileOutputStream(out, true);
            //将文件写出,不覆盖
            workbook.write(fileOutputStream);
        }finally {
            if(is!=null){
                is.close();
            }
            if(fileOutputStream!=null){
                fileOutputStream.close();
            }

        }


    // 将excel文件导出到浏览器
       /* fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/octet-stream");
        response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes("ISO8859-1")));
        response.setHeader("filename", fileName);
        workbook.write(response.getOutputStream());*/
}

    /**
     * 获得指定行的单元格样式
     */
    public CellStyle[] getTemplateStyles(Row row) {
        CellStyle[] styles = new CellStyle[row.getLastCellNum()];
        for (int i = 0; i < row.getLastCellNum(); i++) {
            styles[i] = row.getCell(i).getCellStyle();
        }
        return styles;
    }

    // 省略 setters & getters ..................


}